package tesis.service.impl;


import tesis.service.CrudService;

import tesis.service.TransactionalService;


import java.text.SimpleDateFormat;
import java.util.*;
import javax.inject.Inject;
import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import tesis.common.util.CollectionsUtil;
import tesis.domain.*;
import tesis.dto.in.AplicacionClienteDTO;
import tesis.dto.out.FormDTO;
import tesis.dto.out.InputFormDTO;
import tesis.service.rest.WrapperResults;

@Component("transactionalUsuarioService")
public class TransactionalServiceImpl implements TransactionalService{
    private static Logger LOG = LoggerFactory.getLogger(TransactionalServiceImpl.class);
    private final static String formatoFechas = "dd/MM/yyyy";
    private static SimpleDateFormat dateFormat = new SimpleDateFormat(formatoFechas);

    private final static String USER_DEFAULT = "ADMIN";
   
    @Inject
    @Named("crudService")
    CrudService crud;



    
    public Proceso instalarProceso(Proceso proceso) {
        Map map=new HashMap();
        int nDesactivados=0;
        try{
            LOG.info("Desactivando  procesos anteriores..");
            map.put("version", proceso.getVersion());
            map.put("nombre", proceso.getNombre());
            nDesactivados = crud.executeNamedQuery(Proceso.desactivarProcesosAnt,map);
            
            LOG.info(nDesactivados+" procesos desactivados! ");
            
            return  crud.create(proceso);
        }catch(RuntimeException ex){
            LOG.error("Error al instalar proceso: ", ex);
            throw ex;
        }
    }
      
    
    @Transactional
    public InstanciaEstacion getInstanciaEstacion (Integer  idInstanceStation){
        InstanciaEstacion result = new InstanciaEstacion();
        int cantidadItems = -1;
        try{          
           /* Map map = new HashMap() ;
            map.put(InstanciaEstacion.nameId, idInstanceStation);
            cantidadItems = crud.findCountByNamedQuery(InstanciaEstacion.countItems, map);
            
            if(cantidadItems == 1){*/
                result = crud.find(idInstanceStation, InstanciaEstacion.class);
                result.getIdusuario().getUsuarioXCargoList().size();
                result.getIdinstanciaproceso();
                result.getIdinstanciaproceso().getExpedienteList().size();
                
                
                
                
                for(UsuarioXCargo e:result.getIdusuario().getUsuarioXCargoList()){ 
                    e.getIdcargo().getNombrecargoList().size();
                }
                
                result.getEstadoInstanciaEstacionXInstanciaEstacionList().size();
                for(EstadoInstanciaEstacionXInstanciaEstacion e:result.getEstadoInstanciaEstacionXInstanciaEstacionList()){ 
                    e.getIdestadoinstanciaestacion();
                    e.getHistoricoParametroDocumentoList().size();
                    e.getHistoricoParametroVariableList().size();
                }
                
            /*}else{
                LOG.info("Codigo de instancia no encontrado");
            }*/
        }catch(RuntimeException ex){
            LOG.error("Error al Buscar  instancia: " + ex);
            result = null;
            throw ex;
        }
        return result;
    }
    
    @Transactional
    public List<TipoDocumento> getListaTipoDocumentos(Integer codeStation){
        List<TipoDocumento> lstResult = new ArrayList<TipoDocumento>();
        int cantidadItems = -1;
        try{
            Map map = new HashMap();
            map.put(Estacion.nameId,codeStation);
            cantidadItems = crud.findCountByNamedQuery(Estacion.countItems,map);
            if(cantidadItems == 1){
                Estacion estacion = crud.find(codeStation, Estacion.class);
                estacion.getEstacionXTipoDocumentoList().size();
                for(EstacionXTipoDocumento e:estacion.getEstacionXTipoDocumentoList()){
                    lstResult.add(e.getIdtipodocumento()); 
                }
                
                for(TipoDocumento e: lstResult) e.getEstadoDocumentoList().size();
            }else{
                LOG.info("Codigo de estacion no encontrado");
            }           
            
        }catch(RuntimeException ex){
            LOG.error("Error al buscar los tipos de documentos: " + ex);
            lstResult = null;
        }
        
        return lstResult;
    }
    //Metodo probado
    @Transactional
    public List<Variable> getListaVariables (Integer codeStation){
        List<Variable> lstResult = new ArrayList<Variable>();
        int cantidadItems = -1;
        try{
            Map map = new HashMap();
            map.put(Estacion.nameId, codeStation);
            cantidadItems = crud.findCountByNamedQuery(Estacion.countItems,map);
            if(cantidadItems == 1){
                Estacion estacion = crud.find(codeStation, Estacion.class);
                estacion.getEstacionXVaribleList().size();
                
                for(EstacionXVarible e : estacion.getEstacionXVaribleList()){
                boolean noUbicado = true;
                    for(Variable m :lstResult){
                        if(m.getIdvariable().intValue()== e.getIdvariable().getIdvariable().intValue()){
                            noUbicado = false;
                        }
                    }
                    if(noUbicado) lstResult.add(e.getIdvariable());
                }
            }else{
                LOG.info("Codigo de la estacion no encontrado");
            }
            
        }catch(RuntimeException ex){
            LOG.error("Error al buscar variables: " + ex);
            lstResult = null;
        }
        
        return lstResult;
    }

    
    
    @Transactional
    public Cargo getCargo(Integer codeInstanceStation){
        Cargo result = new Cargo();
        int cantidadItems = -1;
        try{
            Map map = new HashMap();
            map.put(InstanciaEstacion.nameId, codeInstanceStation);
            cantidadItems = crud.findCountByNamedQuery(InstanciaEstacion.countItems,map);
            if(cantidadItems == 1){
                InstanciaEstacion instanciaEstacion = crud.find(codeInstanceStation, InstanciaEstacion.class);
                result = instanciaEstacion.getIdestacion().getIdcargo();
                result.getNombrecargoList().size();
            }else{
                LOG.info("Codigo de la instancia no encontrada");
            }
            
        }catch(RuntimeException ex){
            LOG.error("Error al buscar variables: " + ex);
            result = null;
        }
        
        return result;
    }
    
    @Transactional 
    public  Proceso getProceso(Integer idProceso){
          Proceso result = new Proceso();
          int cantidadItems = -1;
          try{
              /*Map map = new HashMap();
              map.put(Proceso.nameId, idProceso);
              cantidadItems = crud.findCountByNamedQuery(Proceso.countItems,map);
              if(cantidadItems == 1){*/
                  result = crud.find(idProceso, Proceso.class);
                  result.getEstacionList().size();
                  for(Estacion e:result.getEstacionList()){
                      e.getConexionListF().size();
                      e.getConexionListI().size();
                  }
                  result.getInstanciaProcesoList().size();
                  result.getTipoDocumentoList().size();
                  result.getVariableList().size();
              /*    
              }else{
                  LOG.info("Proceso no encontrado");
              }*/
          }catch(RuntimeException ex){
              LOG.error("Error al obtener el proceso: " + ex);
          }
               
          
          return result;
      }
    
    
    
    
    @Transactional
    public InstanciaProceso getInstanciaProcesoByIdStation(Integer codeInstanceStation){
        InstanciaProceso result = new InstanciaProceso();
        int cantidadItems = -1;
            try{
                /*Map map = new HashMap();
                map.put(InstanciaEstacion.nameId, codeInstanceStation);
                cantidadItems = crud.findCountByNamedQuery(InstanciaEstacion.countItems,map);
                if(cantidadItems == 1){*/
                    InstanciaEstacion instancia = crud.find(codeInstanceStation, InstanciaEstacion.class);
                    result = instancia.getIdinstanciaproceso();
                    result.getExpedienteList().size();
                
                /*}else{
                    Log.info("Instancia de estacion no econtrada");
                }*/
            }catch(RuntimeException ex){
                LOG.error("Error al obtener la instancia del proceso: "  + ex);
                result = null;
            }
        return result;
    }
    
    
    @Transactional
    public InstanciaProceso getInstanciaProcesoById(Integer id){
        InstanciaProceso result = new InstanciaProceso();
        int cantidadItems = -1;
        Map map = new HashMap();
        
        try{
            //map.put(InstanciaEstacion.nameId, id);
            //cantidadItems = crud.findCountByNamedQuery(InstanciaProceso.countItems,map);
            //if(cantidadItems == 1){
                result = crud.find(id, InstanciaProceso.class);
            /*}else{
                Log.info("Instancia de estacion no econtrada");
            }*/
        }catch(RuntimeException ex){
            LOG.error("Error al obtener la instancia del proceso: "  + ex);
            result = null;
        }
        return result;
    }
    
    @Transactional
    public Estacion getEstacion(Integer idProceso,String nombreEstacion){
        Estacion estacion = new Estacion();
        List<Estacion> response ;
        try{
            Map map = new HashMap();
            map.put("nombre", nombreEstacion);
            map.put("idproceso", idProceso);
            response = (List<Estacion>) crud.findByNamedQuery("Estacion.findByNombre",map);
            
            if (!CollectionsUtil.isEmpty(response)){
                    estacion = response.get(0);
                    
                    estacion.getConexionEstacionreglaList().size();
                    estacion.getEstacionXTipoDocumentoList().size();
                    estacion.getEstacionXVaribleList().size();
                    estacion.getInstanciaEstacionList().size();
                    estacion.getReglaList().size();
                
                    
                
                    
                    for(Regla regla  : estacion.getReglaList()){
                        regla.getReglaXParametroDocumentoList().size();
                        for(ReglaXParametroDocumento rpd :regla.getReglaXParametroDocumentoList()){
                            rpd.getIdparametrodocumento().getReglaXParametroDocumentoList().size();
                            rpd.getIdparametrodocumento().getInstanciaEstacionXParametroDocumentoList();
                        }
                        regla.getReglaXParametroVariableList().size();
                        for(ReglaXParametroVariable rpv : regla.getReglaXParametroVariableList()){
                            rpv.getIdparamentrovariable().getReglaXParametroVariableList().size();
                            rpv.getIdparamentrovariable().getInstanciaEstacionXParametroVariableList().size();
                            for(InstanciaEstacionXParametroVariable v : rpv.getIdparamentrovariable().getInstanciaEstacionXParametroVariableList()){
                                v.getHistoricoParametroVariableList();
                            }
                            
                            
                        }
                        
                       
                        regla.getConexionEstacionreglaList().size();
                         
                    }
                    estacion.getConexionListF().size();
                    estacion.getConexionListI().size();
                    
                    
            }
            
        }catch(RuntimeException ex){
            LOG.error("Error al obtener la estacion: " + ex);
            estacion = null;
        }
       
        return estacion;        
    }
    
     @Transactional
    public Estacion getEstacion(Integer idEstacion){
        Estacion estacion = new Estacion();
        List<Estacion> response ;
        try{
         
            estacion = crud.find(idEstacion, Estacion.class);
            
            if (estacion!=null){
                   
                    
                    estacion.getConexionEstacionreglaList().size();
                    estacion.getEstacionXTipoDocumentoList().size();
                    estacion.getEstacionXVaribleList().size();
                    estacion.getInstanciaEstacionList().size();
                    estacion.getReglaList().size();
                    
                    for(Regla regla  : estacion.getReglaList()){
                        regla.getReglaXParametroDocumentoList().size();
                        for(ReglaXParametroDocumento rpd :regla.getReglaXParametroDocumentoList()){
                            rpd.getIdparametrodocumento().getReglaXParametroDocumentoList().size();
                            rpd.getIdparametrodocumento().getInstanciaEstacionXParametroDocumentoList();
                            rpd.getIdparametrodocumento().getIdestaciontipodocumento().getIdtipodocumento().getEstadoDocumentoList().size();
                        }
                        regla.getReglaXParametroVariableList().size();
                        for(ReglaXParametroVariable rpv : regla.getReglaXParametroVariableList()){
                            rpv.getIdparamentrovariable().getReglaXParametroVariableList().size();
                            rpv.getIdparamentrovariable().getInstanciaEstacionXParametroVariableList().size();
                        }
                        
                        regla.getConexionEstacionreglaList().size();
                         
                    }
                    estacion.getConexionListF().size();
                    estacion.getConexionListI().size();
                    
                    
            }
            
        }catch(RuntimeException ex){
            LOG.error("Error al obtener la estacion: " + ex);
            estacion = null;
        }
       
        return estacion;        
    }
    
    
    @Transactional
     public InstanciaEstacionXParametroVariable saveInstEstXParVar(InstanciaEstacionXParametroVariable instEstXParVars){
        InstanciaEstacionXParametroVariable result = null;
        try{
            result = crud.create(instEstXParVars);
        }catch(RuntimeException ex){
            LOG.error("Ha ocurrido un error al registrar la InstanciaEstacionXParametroVariable: " + ex);
        }
         
        return result;  
    }
    
    
      
    @Transactional
     public Documento saveDocumento(Documento documento){
        Documento result = null;
        try{
            result = crud.create(documento);
        }catch(RuntimeException ex){
            LOG.error("Ha ocurrido un error al registrar el documento: " + ex);
        }
         
        return result;  
    }
    
     @Transactional
      public Expediente saveExpediente(Expediente expediente){
        Expediente result = null;
        try{
            result = crud.create(expediente);
        }catch(RuntimeException ex){
            LOG.error("Ha ocurrido un error al registrar el documento: " + ex);
        }
         
        return result;  
    }
    
    
   
    
    @Transactional
    public InstanciaEstacionXParametroDocumento saveInstEstXParDoc(InstanciaEstacionXParametroDocumento instEstXParDoc){
        InstanciaEstacionXParametroDocumento result = null; 
        try{
            result = crud.create(instEstXParDoc);
        }catch(RuntimeException ex){
            LOG.error("Ha ocurrido un error al registrar la InstanciaEstacionXParametroVariable: " + ex);
        }
        
        return result;
    }
    
    @Transactional
    public InstanciaEstacion saveInstanciaEstacion(InstanciaEstacion instanciaEstacion){
        InstanciaEstacion result = null; 
        try{
            result = crud.create(instanciaEstacion) ;
            
        }catch(RuntimeException ex){
            LOG.error("Ha ocurrido un error al registrar la InstanciaEstacionXParametroVariable: " + ex);
        }
        return result;
    }
    
    
    @Transactional
    public InstanciaEstacion updateInstanciaEstacion(InstanciaEstacion instanciaEstacion){
        InstanciaEstacion result = null;
        try{
            result = crud.update(instanciaEstacion);
        }catch(RuntimeException ex){
            LOG.error("Ha ocurrido un error al actualizar la InstanciaEstacion: " + ex); 
        }
        
        return result;
    }
    
    
    public InstanciaProceso updateInstanciaProceso(InstanciaProceso instanciaProceso){
        InstanciaProceso result = null;
        try{
            result = crud.update(instanciaProceso);
        }catch(RuntimeException ex){
            LOG.error("Ha ocurrido un error al actualizar la InstanciaProceso: " + ex); 
        }
        
        return result;
             
    }
    
    @Transactional
    public EstadoInstanciaEstacion getEstadoInstanciaEstacion(String nombreEstado){
        EstadoInstanciaEstacion result = new EstadoInstanciaEstacion();
        List<EstadoInstanciaEstacion> lstResul = new ArrayList<EstadoInstanciaEstacion>();
        try{
            Map map = new HashMap();
            map.put("nombre", nombreEstado);
            lstResul = (List<EstadoInstanciaEstacion>) crud.findByNamedQuery("EstadoInstanciaEstacion.findByNombre", map);
            result = lstResul.get(0);
            
        }catch(RuntimeException ex){
            LOG.error("Error al obtener la estadoInstanciaEstacion: " + ex.getMessage());
        }
             
                return result;
        
    }
    
    @Transactional
    public  Expediente getExpediente(Integer Idinstanciaproceso){
         Expediente result  = null ;
         List<Expediente> lstResult = new ArrayList<Expediente>();
         try{
             Map map = new HashMap();
             map.put("idinstanciaproceso",Idinstanciaproceso);
             lstResult = (List<Expediente>) crud.findByNamedQuery("Expediente.findbyInstanciaProceso", map);
             result = lstResult.get(0);
         }catch(RuntimeException ex){
                 LOG.error("Error al obtener el expediente: " + ex.getMessage());
         }
         return result;
     }
    
    
    
    
    
     @Transactional   
     public EstadoInstanciaEstacionXInstanciaEstacion saveEstInstXInstEst(EstadoInstanciaEstacionXInstanciaEstacion estInstXInstEst){
         EstadoInstanciaEstacionXInstanciaEstacion result = new EstadoInstanciaEstacionXInstanciaEstacion();
         try{
             result = crud.create(estInstXInstEst);
         }catch(RuntimeException ex){
             LOG.error("Error al guardar la EstadoInstanciaEstacionXInstanciaEstacion: " + ex.getMessage());  
         }
         return result;
     }
     
     @Transactional
     public EstadoInstanciaProceso getEstadoInstanciaProceso(String nombreEstado){
         EstadoInstanciaProceso result = new EstadoInstanciaProceso();
         List<EstadoInstanciaProceso> lstResult = new ArrayList<EstadoInstanciaProceso>(); 
         try{
             Map map = new HashMap();
             map.put("nombre", nombreEstado);
             lstResult = (List<EstadoInstanciaProceso>) crud.findByNamedQuery("EstadoInstanciaProceso.findByNombre", map);
             result = lstResult.get(0);
             
         }catch(RuntimeException ex){
             LOG.error("Error al obtener el EstadoInstanciaEstacion: " + ex.getMessage());
         }
         return result;
     }
    
     @Transactional
     public InstanciaProcesoXEstadoInstanciaProceso saveInstProXEstInstPro(InstanciaProcesoXEstadoInstanciaProceso instProXEstInstPro){
         InstanciaProcesoXEstadoInstanciaProceso result = new InstanciaProcesoXEstadoInstanciaProceso();
         try{
             result = crud.create(instProXEstInstPro);
         }catch(RuntimeException ex){
              LOG.error("Error al guardar la InstanciaProcesoXEstadoInstanciaProceso: " + ex.getMessage());  
         }
         return result;
     }
     
     
    @Transactional
     public   EstadoInstanciaEstacionXInstanciaEstacion getEstadoInstanciaEstacion(InstanciaEstacion instancia){
        EstadoInstanciaEstacionXInstanciaEstacion result = new EstadoInstanciaEstacionXInstanciaEstacion();
        List<EstadoInstanciaEstacionXInstanciaEstacion> lstResult = new ArrayList<EstadoInstanciaEstacionXInstanciaEstacion>();
        try{  
            Map map = new HashMap();
            map.put(EstadoInstanciaEstacionXInstanciaEstacion.Instancia_Estacion,instancia.getIdinstanciaestacion().intValue());
            lstResult = (List<EstadoInstanciaEstacionXInstanciaEstacion>) crud.findByNamedQuery(EstadoInstanciaEstacionXInstanciaEstacion.Find_Estado_Estacion, map);
            result = lstResult.size()>0?lstResult.get(0):result;

        }catch(RuntimeException ex){
            LOG.error("Error al obtener : EstadoInstanciaEstacionXInstanciaEstacion" + ex.getMessage());  
        }
        return result;   
    }
    
    @Transactional
    public HistoricoParametroVariable saveHistoricoParametroVariable(HistoricoParametroVariable historia){
        HistoricoParametroVariable result = new HistoricoParametroVariable();
        try{
            result = crud.create(historia);
        }catch(RuntimeException ex){
            LOG.error("Error al guardar HistoricoParametroVariable" + ex.getMessage()); 
        }
        
        return result;
    }
    
    @Transactional
    public HistoricoParametroDocumento saveHistoricoParametroDocumento(HistoricoParametroDocumento historia){
        HistoricoParametroDocumento result = new HistoricoParametroDocumento();
        try{
            result = crud.create(historia);
        }catch(RuntimeException ex){
            LOG.error("Error al guardar HistoricoParametroDocumento" + ex.getMessage()); 
        }
        
        return result;
    }
    
    
    @Transactional
    public   Usuario  asignarUsuario(Cargo cargo){
        Usuario usuario = new Usuario();
        List<UsuarioXCargo> lstResList = new ArrayList<UsuarioXCargo>();
        try{
            Map map = new HashMap();
            map.put(UsuarioXCargo.IdCargo, cargo.getIdcargo().intValue());
            lstResList = (List<UsuarioXCargo>) crud.findByNamedQuery(UsuarioXCargo.findUsuarioXAsignar, map);
            usuario = lstResList.get(0).getIdusuario();
            float cargaLaboral = usuario.getCargalaboral();
            usuario.setCargalaboral(cargaLaboral+1);
            crud.update(usuario);
        }catch(RuntimeException ex){
             LOG.error("Error al obtner el usuarioss" + ex.getMessage()); 
        }
        return usuario;
    }
    
      @Transactional
      public WrapperResults getInstanciaEstacionByUser(AplicacionClienteDTO aplicacionClienteDTO){
          List<InstanciaEstacion> lstResult = new ArrayList<InstanciaEstacion>();
          Integer cantidadTotal=0;
          WrapperResults resultados=new WrapperResults();
          try{
              Integer ini= aplicacionClienteDTO.getInicio();
              Integer fin = aplicacionClienteDTO.getUltimo()-aplicacionClienteDTO.getInicio();
              
              Map map = new HashMap();
              map.put("idusuario", aplicacionClienteDTO.getIdUsuarioDTO());
              map.put("nombreEstado", aplicacionClienteDTO.getNombreEstadoEstacion());
              String sqlColumns=" i ";
              String sqlCount=" COUNT(i.idinstanciaestacion) ";
              String orderBy=" ORDER BY fechacreacion DESC ";
              String sql="";
                    
                sql+=" FROM InstanciaEstacion i,EstadoInstanciaEstacionXInstanciaEstacion e";

                sql+=" WHERE i.idusuario.idusuario = :idusuario  "+
                        " and i.idinstanciaestacion=e.idinstanciaestacion.idinstanciaestacion   "+
                        " and e.idestadoinstanciaestacion.nombre=:nombreEstado  ";
                if (!aplicacionClienteDTO.getNombreProceso().equals("")){
                    sql+= " and i.idinstanciaproceso.idproceso.nombre =:nombreProceso ";
                    map.put("nombreProceso", aplicacionClienteDTO.getNombreProceso());
                }
                sql+=" and e.idestadoinstancia = (select max (idestadoinstancia) from EstadoInstanciaEstacionXInstanciaEstacion s where s.idinstanciaestacion=i) " ;
              
              lstResult = (List<InstanciaEstacion>) crud.findByQuery("SELECT "+sqlColumns+sql+orderBy, map,ini,fin); 

              //CONTAR
              cantidadTotal=crud.findCountByQuery("SELECT "+sqlCount+sql,map);
              
              
              for(InstanciaEstacion e:lstResult){
                  e.getIdusuario().getUsuarioXCargoList().size();
                  List<UsuarioXCargo> lstUserXCar = e.getIdusuario().getUsuarioXCargoList();
                  for(UsuarioXCargo uc: lstUserXCar){
                      uc.getIdcargo().getNombrecargoList().size();
                  }
                  e.getEstadoInstanciaEstacionXInstanciaEstacionList().size();
                  e.getIdinstanciaproceso().getExpedienteList().size();
                  /*
                    for(EstadoInstanciaEstacionXInstanciaEstacion s:e.getEstadoInstanciaEstacionXInstanciaEstacionList()){ 
                        s.getIdestadoinstanciaestacion();
                    }
                    * *
                    */
                
              }
              
              resultados.setListaResultados(lstResult);
              resultados.setCantidadTotal(cantidadTotal);
              
          }catch(RuntimeException ex){
              LOG.error("Error al obtener las instancias de estacion del usuario " + aplicacionClienteDTO.getIdUsuarioDTO() +" :" + ex.getMessage());
          }
          return resultados;
                  
      }
      
      @Transactional
      public List<EstadoInstanciaEstacion> getEstadoInstanciaEstacion(){
          List<EstadoInstanciaEstacion> lstResult = new ArrayList<EstadoInstanciaEstacion>();
          
          try{
              lstResult = (List<EstadoInstanciaEstacion>) crud.findByNamedQuery("EstadoInstanciaEstacion.findAll");              
          }catch(RuntimeException ex){
              LOG.error("Error al obtener los estado de la insntanciad estacion: " + ex ); 
          } 
          return lstResult; 
      }
      
      
      
      @Transactional
      public Cargo getCargoByUser( Integer idUsuario){
          Cargo cargo = new Cargo();
          List<UsuarioXCargo> lstResult = new ArrayList<UsuarioXCargo>();
          try{
              Map map = new HashMap();
              map.put("idusuario", idUsuario);
              lstResult = (List<UsuarioXCargo>) crud.findByNamedQuery(UsuarioXCargo.findCargoByUsuario,map);
              cargo = lstResult.get(0).getIdcargo();
          }catch(RuntimeException ex){
              LOG.error("Error al obtener el cargo del usuario: " + ex );    
          }
          return cargo;
      }
      
      
      
      @Transactional
      public  WrapperResults getEstacionbyCargo(Integer idCargo, Integer inicio, Integer fin){
          WrapperResults wrapperResultados=new WrapperResults();
          Integer cantidadTotal=0;
          List<Estacion> result = new ArrayList<Estacion>();
          try{
              Map map = new HashMap();
              map.put("idcargo", idCargo);
              result = (List<Estacion>) crud.findByNamedQuery(Estacion.findbyCargo, map);
              cantidadTotal = crud.findCountByNamedQuery(Estacion.countByCargo, map);
              /*for(Estacion e: result){
                  e.getConexionListI().size();
                  e.getConexionListF().size();
              }*/
              wrapperResultados.setListaResultados(result);
              wrapperResultados.setCantidadTotal(cantidadTotal);
          }catch(RuntimeException ex){
              LOG.error("Error al obtener las estaciones: " + ex);
          }
          
          return wrapperResultados;
      }
      
      
      
      @Transactional
       public   InstanciaProceso createInstanceProceso(InstanciaProceso instancia){
          try {
              if (instancia.getIdinstanciaproceso()==null)
                instancia = crud.create(instancia);
              else
                instancia= crud.update(instancia);
          }
          catch(RuntimeException ex){
                  LOG.error("Error al crear el proceso ex:" + ex);
          }
          return  instancia;
      }
      
      
      @Transactional
       public   InstanciaEstacion createInstanceEstacion(InstanciaEstacion instancia){
          try {
              if (instancia.getIdinstanciaestacion()==null)
                instancia = crud.create(instancia);
              else
                  instancia = crud.update(instancia);
          }
          catch(RuntimeException ex){
                  LOG.error("Error al crear el proceso ex:" + ex);
          }
          return  instancia;
      }

    public FormDTO getVariablesForm(Integer idEstacion) {
        FormDTO form=new FormDTO();
        String query=null;
        Map map=new HashMap();
        List results=null;
        Object[] result=null;
        InputFormDTO input=null;
        try {
            /*VARIABLES*/
             LOG.info("Obteniendo varibles de estacion: "+idEstacion);
             map.put("idEstacion", idEstacion);
             query="select v.nombre,rxv.esentrada from estacion e, estacion_x_varible exv, regla r, "+
                    " variable v, parametro_variable p, regla_x_parametro_variable rxv "+
                    " where e.idestacion=:idEstacion and exv.idestacion=e.idestacion "+
                    " and r.idestacion=e.idestacion and v.idvariable=exv.idvariable "+
                    " and p.idestacionvariable=exv.idestacionvariable "+
                    " and rxv.idregla=r.idregla and rxv.idparamentrovariable=p.idparamentrovariable and esentrada='Y'";
             
             results=crud.findByNativeQuery(query, map);
             if (results!=null && !results.isEmpty()){
                 for (Object r:results){
                     input=new InputFormDTO();
                     result=(Object[])r;
                     input.setNombre(result[0].toString());
                     input.setEsEntrada(result[1]!=null?result[1].toString():null);
                     input.setDocumento(false);
                     form.getInputs().add(input);
                 }
                 LOG.info("Variables obtenidas : "+form.getInputs().size() );
             }
             
             /*DOCUMENTOS*/
             LOG.info("Obteniendo input documentos de estacion: "+idEstacion);
             
             query="SELECT tipo_documento.nombre, regla_x_parametro_documento.esentrada FROM "+
                    " estacion, regla, regla_x_parametro_documento, parametro_documento, estacion_x_tipo_documento, tipo_documento "+
                    " WHERE "+
                    " estacion.idestacion = regla.idestacion AND "+
                    " estacion.idestacion = estacion_x_tipo_documento.idestacion AND "+
                    " regla.idregla = regla_x_parametro_documento.idregla AND "+
                    " regla_x_parametro_documento.idparametrodocumento = parametro_documento.idparametrodocumento AND "+
                    " estacion_x_tipo_documento.idestaciontipodocumento = parametro_documento.idestaciontipodocumento AND "+
                    " tipo_documento.idtipodocumento = estacion_x_tipo_documento.idtipodocumento AND "+
                    " estacion.idestacion=:idEstacion and esentrada='Y'";
             
             results=crud.findByNativeQuery(query, map);
             if (results!=null && !results.isEmpty()){
                 for (Object r:results){
                     input=new InputFormDTO();
                     result=(Object[])r;
                     input.setNombre(result[0].toString());
                     input.setEsEntrada(result[1]!=null?result[1].toString():null);
                     input.setDocumento(true);
                     form.getInputs().add(input);
                 }
                 LOG.info("Inputs documentos obtenidos : "+form.getInputs().size() );
             }
          }
          catch(RuntimeException ex){
                  LOG.error("Error al obtener datos ex:" + ex);
          }
          return  form;
    }

    
    public FormDTO getValoresParametros(Integer idInstanciaProceso) {
        FormDTO form=new FormDTO();
        String query=null;
        Map map=new HashMap();
        List results=null;
        InputFormDTO input=null;
        try {
            /*VARIABLES*/
             LOG.info("Obteniendo valores de varibles de instancia proceso: "+idInstanciaProceso);
             
             map.put("idInstanciaProceso", idInstanciaProceso);
             
             query="SELECT "+
                   " variable.nombre,  "+
                   "  historico_parametro_variable.valorvariable,  "+
                   "  estacion.idtemp,"+
                   " esentrada,"+
                   " to_char(instancia_estacion.fechatermino,'dd/mm/yyyy HH24:mi:ss'), "+
                   " parametro_variable.esverdadera "+
                   " FROM  "+
                   "  estacion,  "+
                   "  estacion_x_varible,  "+
                   "  instancia_estacion,  "+
                   "  instancia_estacion_x_parametro_variable,  "+
                   "  parametro_variable,  "+
                   "  variable,  "+
                   "  historico_parametro_variable, "+
                   " regla, "+
                   " regla_x_parametro_variable"  +
                   "  WHERE  "+
                   "  estacion.idestacion = instancia_estacion.idestacion AND "+
                   "  instancia_estacion.idinstanciaestacion = instancia_estacion_x_parametro_variable.idinstanciaestacion AND "+
                   "  instancia_estacion_x_parametro_variable.idparamentrovariable = parametro_variable.idparamentrovariable AND "+
                   "  instancia_estacion_x_parametro_variable.idestacionparametrovariable = historico_parametro_variable.idestacionparametrovariable AND "+
                   "  parametro_variable.idestacionvariable = estacion_x_varible.idestacionvariable AND "+
                   "  variable.idvariable = estacion_x_varible.idvariable "+
                   "  and instancia_estacion.idinstanciaproceso=:idInstanciaProceso " +
                   "  and estacion_x_varible.idestacion=estacion.idestacion "+
                   "  and regla_x_parametro_variable.idregla=regla.idregla "+
                   "  and regla_x_parametro_variable.idparamentrovariable=parametro_variable.idparamentrovariable";
             
             results=crud.findByNativeQuery(query, map);
             if (results!=null && !results.isEmpty()){
                 for (Object r:results){
                     Object[]result=(Object[])r;
                     input=new InputFormDTO();
                     input.setIdTempEstacion(result[2].toString());
                     input.setNombre(result[0].toString());
                     input.setValor(result[1]!=null?result[1].toString():null);
                     input.setEsEntrada(result[3]!=null?result[3].toString():null);
                     input.setFechaEjecucion(result[4]!=null?result[4].toString():null);
                     input.setEsVerdadera(result[5]!=null?result[5].toString():null);
                     input.setDocumento(false);
                     form.getInputs().add(input);
                 }
                 LOG.info("Variables obtenidas : "+form.getInputs().size() );
             }
             /*
             /*DOCUMENTOS
             LOG.info("Obteniendo input documentos de estacion: "+idEstacion);
             
             query="SELECT tipo_documento.nombre, regla_x_parametro_documento.esentrada FROM "+
                    " estacion, regla, regla_x_parametro_documento, parametro_documento, estacion_x_tipo_documento, tipo_documento "+
                    " WHERE "+
                    " estacion.idestacion = regla.idestacion AND "+
                    " estacion.idestacion = estacion_x_tipo_documento.idestacion AND "+
                    " regla.idregla = regla_x_parametro_documento.idregla AND "+
                    " regla_x_parametro_documento.idparametrodocumento = parametro_documento.idparametrodocumento AND "+
                    " estacion_x_tipo_documento.idestaciontipodocumento = parametro_documento.idestaciontipodocumento AND "+
                    " tipo_documento.idtipodocumento = estacion_x_tipo_documento.idtipodocumento AND "+
                    " estacion.idestacion=:idEstacion and esentrada='Y'";
             
             results=crud.findByNativeQuery(query, map);
             if (results!=null && !results.isEmpty()){
                 for (Object r:results){
                     input=new InputFormDTO();
                     result=(Object[])r;
                     input.setNombre(result[0].toString());
                     input.setValor(result[1]!=null?result[1].toString():null);
                     input.setDocumento(true);
                     form.getInputs().add(input);
                 }
                 LOG.info("Inputs documentos obtenidos : "+form.getInputs().size() );
             }
             */
          }
          catch(RuntimeException ex){
                  LOG.error("Error al crear el proceso ex:" + ex);
          }
          return  form;
    }
    @Transactional
     public List <InstanciaEstacionXParametroVariable> getInstanciaEstXParametroVar(Integer idParVar, Integer codeInstanceStation){
  
         List<InstanciaEstacionXParametroVariable> lstResult = new ArrayList<InstanciaEstacionXParametroVariable>();
         try{
             Map map = new HashMap();
             map.put("idparamentrovariable",idParVar);
             map.put("idinstanciaestacion",codeInstanceStation);
             lstResult = (List<InstanciaEstacionXParametroVariable>) crud.findByNamedQuery("InstanciaEstacionXParametroVariable.findbyParVarInstancia", map);
             for(InstanciaEstacionXParametroVariable e: lstResult){
                 e.getHistoricoParametroVariableList().size();
             }
        
         }catch(RuntimeException ex){
                 LOG.error("Error al obtener el expediente: " + ex.getMessage());
         }
              
        
        return lstResult;
         
     }
    
     @Transactional
     public List <InstanciaEstacionXParametroDocumento> getInstanciaEstXParametroDoc(Integer idParVar, Integer codeInstanceStation){
  
         List<InstanciaEstacionXParametroDocumento> lstResult = new ArrayList<InstanciaEstacionXParametroDocumento>();
         try{
             Map map = new HashMap();
             map.put("idparametrodocumento",idParVar);
             map.put("idinstanciaestacion",codeInstanceStation);
             lstResult = (List<InstanciaEstacionXParametroDocumento>) crud.findByNamedQuery("InstanciaEstacionXParametroVariable.findbyParDocInstancia", map);
             for(InstanciaEstacionXParametroDocumento e: lstResult){
                 e.getHistoricoParametroDocumentoList().size();
             }
        
         }catch(RuntimeException ex){
                 LOG.error("Error al obtener el expediente: " + ex.getMessage());
         }
              
        
        return lstResult;
         
     }

    public FormDTO getValoresEstacionAnterior(Integer idInstanciaProceso, Integer idInstanciaEstacionActual) {
        FormDTO form=new FormDTO();
        String query=null;
        Map map=new HashMap();
        List results=null;
        InputFormDTO input=null;
        try {
            /*VARIABLES*/
             LOG.info("Obteniendo valores de varibles estaciones anteriores" );
             
             map.put("idInstanciaProceso", idInstanciaProceso);
             map.put("idInstanciaEstacionActual", idInstanciaEstacionActual);
             
             query=" SELECT variable.nombre,instancia_estacion_x_parametro_variable.valorvariable  "+
                    " FROM  "+
                    " instancia_estacion,  "+
                    " instancia_estacion_x_parametro_variable,  "+
                    " parametro_variable,  "+
                    " estacion_x_varible,  "+
                    " variable "+
                    " WHERE  "+
                    " instancia_estacion.idinstanciaestacion = instancia_estacion_x_parametro_variable.idinstanciaestacion AND "+
                    " instancia_estacion_x_parametro_variable.idparamentrovariable = parametro_variable.idparamentrovariable AND "+
                    " parametro_variable.idestacionvariable = estacion_x_varible.idestacionvariable AND "+
                    " estacion_x_varible.idvariable = variable.idvariable "+
                    " and instancia_estacion.idinstanciaproceso=:idInstanciaProceso "+
                    " and instancia_estacion.idinstanciaestacion!=:idInstanciaEstacionActual  "+
                    " order by instancia_estacion_x_parametro_variable.fechaModificacion desc";
             
             results=crud.findByNativeQuery(query, map);
             if (results!=null && !results.isEmpty()){
                 for (Object r:results){
                     Object[]result=(Object[])r;
                     input=new InputFormDTO();
                     input.setNombre(result[0].toString());
                     input.setValor(result[1]!=null?result[1].toString():null);
                     input.setDocumento(false);
                     form.getInputs().add(input);
                 }
                 LOG.info("Valores de Variables obtenidas : "+form.getInputs().size() );
             }
          }catch(RuntimeException ex){
                  LOG.error("Error al obtener valores de estaciones anteriores ex:" + ex);
          }
          return  form;
    }
      
    
    
    
}
